package views;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.SimpleDateFormat;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import javax.swing.text.html.HTMLDocument.Iterator;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import controller.Serializer;
import models.Bank;
import models.Person;
import models.SavingAccount;
import models.SpendingAccount;
import models.Account;
public class AdminViewAccounts {
private Serializer io;
private JTable table;
private DefaultTableModel model;
private Bank bank;
private String amount;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
/**
* constructor
*/
public AdminViewAccounts() {
JFrame frame = new JFrame();
io = new Serializer();
table = new JTable();
bank = io.deserializeBank();
// create a table model and set a Column Identifiers to this model
Object[] columns = { "Name", "Type", "Money", "Open Date", "Expiration Date" };
model = new DefaultTableModel();
model.setColumnIdentifiers(columns);
Font font = new Font("", 1, 18);
table.setModel(model);
table.setBackground(new Color(255, 255, 230));
table.setForeground(new Color(81, 52, 21));
table.setGridColor(new Color(81, 52, 21));
table.setFont(font);
table.setRowHeight(30);
for (Entry<Person, ArrayList<Account>> entry : bank.getBankData().entrySet()) {
Person key = entry.getKey();
Object value = entry.getValue();
for (Account a : entry.getValue()) {
Object[] row = { entry.getKey().getName(), a.getType(), a.getAccountSum(),
sdf.format(a.getcreationDate()), sdf.format(a.getValidUntilDate()) };
model.addRow(row);
}
}
JTextField textName = new JTextField();
JTextField textType = new JTextField();
JTextField textMoney = new JTextField();
// create JButtons
JButton btnAdd = new JButton("Add Account");
btnAdd.setBackground(new Color(255, 255, 230));
JButton btnRemove = new JButton("Remove Account");
btnRemove.setBackground(new Color(255, 255, 230));
JButton btnDeposit = new JButton("Deposit");
btnDeposit.setBackground(new Color(255, 255, 230));
JButton btnWithdraw = new JButton("Withdraw");
btnWithdraw.setBackground(new Color(255, 255, 230));
JButton btnViewClients = new JButton("View Clients");
btnViewClients.setBackground(new Color(255, 255, 230));
// textId.setBounds(20, 220, 100, 25);
textName.setBounds(20, 210, 150, 25);
textName.setBackground(new Color(255, 255, 230));
textType.setBounds(20, 240, 150, 25);
textType.setBackground(new Color(255, 255, 230));
textMoney.setBounds(20, 270, 150, 25);
textMoney.setBackground(new Color(255, 255, 230));
btnAdd.setBounds(180, 210, 150, 25);
btnDeposit.setBounds(180, 240, 150, 25);
btnRemove.setBounds(180, 270, 150, 25);
btnWithdraw.setBounds(180, 330, 150, 25);
btnViewClients.setBounds(180, 300, 150, 25);
// create JScrollPane
JScrollPane pane = new JScrollPane(table);
pane.setBounds(0, 0, 880, 200);
pane.getViewport().setBackground(new Color(232, 189, 128));
pane.setBackground(new Color(232, 189, 128));
frame.setLayout(null);
frame.add(pane);
// add JTextFields to the jframe
// frame.add(textId);
frame.add(textName);
frame.add(textType);
frame.add(textMoney);
// add JButtons to the jframe
frame.add(btnAdd);
frame.add(btnRemove);
frame.add(btnDeposit);
frame.add(btnWithdraw);
frame.add(btnViewClients);
// create an array of objects to set the row data
Object[] row = new Object[5];
// button add row
btnAdd.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
row[0] = textName.getText();
row[1] = textType.getText();
row[2] = textMoney.getText();
boolean validOperation = false;
boolean personFound = false;
for (Person p : bank.getBankData().keySet()) {
if (p.getName().compareTo(row[0].toString()) == 0) {
personFound = true;
Account account;
if (row[1].toString().compareTo("Spending") == 0) {
account = new SpendingAccount(Double.parseDouble(row[2].toString()));
validOperation = true;
} else if (row[1].toString().compareTo("Saving") == 0) {
account = new SavingAccount(Double.parseDouble(row[2].toString()));
validOperation = true;
} else {
JOptionPane.showMessageDialog(null, "Please register a valid type");
account = null;
}
if ((account != null) && (validOperation) && (account.sumIsInsufficient() == false)) {
bank.addHolderAccount(p, account);
row[3] = sdf.format(account.getcreationDate());
row[4] = sdf.format(account.getValidUntilDate());
model.addRow(row);
} else if (account.sumIsInsufficient())
JOptionPane.showMessageDialog(null, "Client need at least 10$ to open a saving account");
else
JOptionPane.showMessageDialog(null, "Some data might not be valid");
}
}
if (personFound == false)
JOptionPane.showMessageDialog(null, "Please register the client first");
System.out.println(bank.getReport());
io.SerializeBank(bank);
}
});
btnViewClients.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new AdminViewClients();
frame.dispose();
}
});
btnWithdraw.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// amount = af.getAmount();
int i = table.getSelectedRow();
if (i >= 0) {
java.util.Iterator<Entry<Person, ArrayList<Account>>> it = bank.getBankData().entrySet().iterator();
Entry<Person, ArrayList<Account>> entry;
while (it.hasNext()) {
entry = it.next();
if (entry.getKey().getName().compareTo(textName.getText().toString()) == 0) {
for (java.util.Iterator<Account> itAcc = entry.getValue().iterator(); itAcc.hasNext();) {
Account account = (Account) itAcc.next();
if (account.getType().compareTo(textType.getText()) == 0)
if ((Double) account.getAccountSum() == (Double.parseDouble(textMoney.getText()))){
amount=JOptionPane.showInputDialog(null,"Please insert the amount of money");
account.withdrawMoney(Double.parseDouble(amount));
if (account.sumIsInsufficient()) {
JOptionPane.showMessageDialog(null,
"Cannot perform this operation.Insufficient funds");
account.setSumIsInsufficient(false);
} else {
io.SerializeBank(bank);
JOptionPane.showMessageDialog(null, "Successful operation");
model.setValueAt(account.getAccountSum(), i, 2);
}
}
}
}
}
} else {
System.out.println("Withdrawal Error");
}
}
});
// button remove row
btnRemove.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int i = table.getSelectedRow();
boolean validOperation = false;
int index=-1;
int count=-1;
if (i >= 0) {
java.util.Iterator<Entry<Person, ArrayList<Account>>> it = bank.getBankData().entrySet().iterator();
Entry<Person, ArrayList<Account>> entry;
while (it.hasNext()) {
entry = it.next();
if (entry.getKey().getName().compareTo(textName.getText().toString()) == 0) {
for (java.util.Iterator<Account> itAcc = entry.getValue().iterator(); itAcc.hasNext();) {
Account account = (Account) itAcc.next();
count++;
if (account.getType().compareTo(textType.getText()) == 0) {
if ((Double) account.getAccountSum() == (Double.parseDouble(textMoney.getText())))
index=count;
validOperation = true;
}
}
if (validOperation){
bank.removeHolderAccount(entry.getKey(), bank.getBankData().get(entry.getKey()).get(index));
io.SerializeBank(bank);
System.out.println(bank.getReport());
model.removeRow(i);}
else
JOptionPane.showMessageDialog(null, "There was an error in the system");
}
}
} else {
System.out.println("Delete Error");
}
}
});
// get selected row data From table to textfields
table.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// i = the index of the selected row
int i = table.getSelectedRow();
textName.setText(model.getValueAt(i, 0).toString());
textType.setText(model.getValueAt(i, 1).toString());
textMoney.setText(model.getValueAt(i, 2).toString());
}
});
// button update row
btnDeposit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int i = table.getSelectedRow();
if (i >= 0) {
java.util.Iterator<Entry<Person, ArrayList<Account>>> it = bank.getBankData().entrySet().iterator();
Entry<Person, ArrayList<Account>> entry;
while (it.hasNext()) {
entry = it.next();
if (entry.getKey().getName().compareTo(textName.getText().toString()) == 0) {
for (java.util.Iterator<Account> itAcc = entry.getValue().iterator(); itAcc.hasNext();) {
Account account = (Account) itAcc.next();
if (account.getType().compareTo(textType.getText()) == 0)
if ((Double) account.getAccountSum() == (Double.parseDouble(textMoney.getText()))){
amount=JOptionPane.showInputDialog(null,"Please insert the amount of money");
account.depositMoney(Double.parseDouble(amount));
io.SerializeBank(bank);
JOptionPane.showMessageDialog(null, "Successful operation");
model.setValueAt(account.getAccountSum(), i, 2);
}
}
}
}
} else {
System.out.println("Deposit Error");
}
}
});
frame.setSize(900, 410);
frame.getContentPane().setBackground(new Color(162, 104, 42));
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}